/**
 * JSON文件读写辅助工具
 * 确保使用正确的UTF-8编码
 */

const fs = require('fs').promises;
const { fixObjectEncoding } = require('../middleware/fixEncoding');

/**
 * 读取JSON文件并修复编码
 * @param {string} filePath - 文件路径
 * @returns {Promise<Object>} - 解析后的对象
 */
async function readJsonFile(filePath) {
    try {
        // 读取文件（确保使用utf-8）
        const content = await fs.readFile(filePath, 'utf-8');
        
        // 解析JSON
        let data = JSON.parse(content);
        
        // 修复编码问题
        data = fixObjectEncoding(data);
        
        return data;
    } catch (error) {
        throw new Error(`读取JSON文件失败 (${filePath}): ${error.message}`);
    }
}

/**
 * 写入JSON文件（确保UTF-8编码）
 * @param {string} filePath - 文件路径
 * @param {Object} data - 要写入的数据
 * @param {boolean} pretty - 是否格式化（默认true）
 */
async function writeJsonFile(filePath, data, pretty = true) {
    try {
        // 先修复数据中的编码问题
        const fixedData = fixObjectEncoding(data);
        
        // 转换为JSON字符串
        const content = pretty 
            ? JSON.stringify(fixedData, null, 2) 
            : JSON.stringify(fixedData);
        
        // 写入文件（确保使用utf-8，不添加BOM）
        await fs.writeFile(filePath, content, { encoding: 'utf-8' });
        
        console.log(`✅ [JSON] 已保存文件: ${filePath}`);
    } catch (error) {
        throw new Error(`写入JSON文件失败 (${filePath}): ${error.message}`);
    }
}

/**
 * 安全更新JSON文件（先读取，修改，再写入）
 * @param {string} filePath - 文件路径
 * @param {Function} updater - 更新函数
 */
async function updateJsonFile(filePath, updater) {
    try {
        // 读取现有数据
        const data = await readJsonFile(filePath);
        
        // 应用更新
        const updated = await updater(data);
        
        // 写回文件
        await writeJsonFile(filePath, updated);
        
        return updated;
    } catch (error) {
        throw new Error(`更新JSON文件失败 (${filePath}): ${error.message}`);
    }
}

module.exports = {
    readJsonFile,
    writeJsonFile,
    updateJsonFile
};

